/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package actioncombination.logic.agent.action;

import actioncombination.common.datastructure.Simple;
import actioncombination.common.value.IntegerValue;
import actioncombination.common.value.IntegerValue;
import actioncombination.problem.gridworld.AgentStateImpl;
import actioncombination.logic.agent.AgentState;
import actioncombination.logic.environment.EnvironmentState;
import actioncombination.logic.environment.RLEnvironmentState;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Administrador
 */
public class TurnLeft extends ActionDirection {

    @Override
    public AgentState execute(AgentState s) {
        AgentStateImpl estado = (AgentStateImpl) s;
        //obtengo la direccion que trae el agente
        IntegerValue angulo = (IntegerValue) estado.getAngle();
        int indice;
        try {
            //obtengo el indice dentro del arreglo de angulos 
            //correspondiente a la direccion que trae el agente
            indice = this.getActionIndex(angulo);
            
            if (indice == 0) {
                //Como la accion es doblar a la izquierda cambio la direccion del agente
                //asignando el angulo que esta a la izquierda en el arreglo de angulos
                //si el indice es cero devuelve el ultimo elemento del arreglo de angulos 
                //el ultimo corresponde al de la izquierda del primero
                estado.setAngle((IntegerValue) this.getTypesOfAngles().get(this.getTypesOfAngles().size() - 1));
            } else {
                //Asigna el elemento que esta a la izquierda en el arreglo de angulos
                estado.setAngle((IntegerValue) this.getTypesOfAngles().get(indice - 1));
            }

        } catch (Exception ex) {
            ex.getMessage();
        }
        //retorna el estado del agente con la direccion cambiada
        return estado;
    }

    @Override
    public EnvironmentState execute(AgentState ast, EnvironmentState est) {
        RLEnvironmentState estado=(RLEnvironmentState) est;
        return estado;
    }

    @Override
    public Double getCost() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public String toString() {
        throw new UnsupportedOperationException("Not supported yet.");
    }
}
